home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / libcs / prstab.c < prev    next >
C/C++ Source or Header  |  1995-06-12  |  4KB  |  127 lines

  1. /*
  2.  * Copyright (c) 1990 Carnegie Mellon University
  3.  * All Rights Reserved.
  4.  * 
  5.  * Permission to use, copy, modify and distribute this software and its
  6.  * documentation is hereby granted, provided that both the copyright
  7.  * notice and this permission notice appear in all copies of the
  8.  * software, derivative works or modified versions, and any portions
  9.  * thereof, and that both notices appear in supporting documentation.
  10.  *
  11.  * THE SOFTWARE IS PROVIDED "AS IS" AND CARNEGIE MELLON UNIVERSITY
  12.  * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  13.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT
  14.  * SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY SPECIAL, DIRECT,
  15.  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  16.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
  17.  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  18.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19.  *
  20.  * Users of this software agree to return to Carnegie Mellon any
  21.  * improvements or extensions that they make and grant Carnegie the
  22.  * rights to redistribute these changes.
  23.  *
  24.  * Export of this software is permitted only after complying with the
  25.  * regulations of the U.S. Deptartment of Commerce relating to the
  26.  * Export of Technical Data.
  27.  */
  28. /*  prstab, fprstab  --  print list of strings
  29.  *
  30.  *  Usage:  prstab (table);
  31.  *        fprstab (file,table);
  32.  *    char **table;
  33.  *    FILE *file;
  34.  *
  35.  *  table is an array of pointers to strings, ending with a 0
  36.  *  value.  This is the same format as "stablk" tables.
  37.  *
  38.  *  Prstab will attempt to print the strings in a concise format,
  39.  *  using multiple columns if its heuristics indicate that this is
  40.  *  desirable.
  41.  *  Fprstab is the same, but you can specify the file instead of using
  42.  *  stdout.
  43.  *
  44.  *  The heuristics are these:  assume that each column must be at
  45.  *  least as wide as the longest string plus three blanks.  Figure
  46.  *  out how many columns can fit on a line, and suppose that we use
  47.  *  that many columns.  This represents the "widest" useable format.
  48.  *  Now, see if this is too wide.  This means that there are just a
  49.  *  few strings, and we would like them to be printed in fewer columns,
  50.  *  with each column being a little bit longer.  The heuristic rule is
  51.  *  that we will always use at least some minimum number of rows (8)
  52.  *  if there are at least that many strings.
  53.  *
  54.  *  HISTORY
  55.  * $Log:    prstab.c,v $
  56.  * Revision 1.2  90/12/11  17:57:52  mja
  57.  *     Add copyright/disclaimer for distribution.
  58.  * 
  59.  * 28-Apr-85  Steven Shafer (sas) at Carnegie-Mellon University
  60.  *    Modified for 4.2 BSD.  Also added fprstab() routine.
  61.  *
  62.  * 15-Mar-83  Steven Shafer (sas) at Carnegie-Mellon University
  63.  *    Fixed two bugs:  printing extra spaces at end of last column, and
  64.  *    dividing by zero if ncol = 0 (i.e. very long string).
  65.  *
  66.  * 16-Apr-80  Steven Shafer (sas) at Carnegie-Mellon University
  67.  *    Created.
  68.  *
  69.  */
  70.  
  71. #include <stdio.h>
  72.  
  73. #define SPACE 5            /* min. space between columns */
  74. #define MAXCOLS 71        /* max. cols on line */
  75. #define MINROWS 8        /* min. rows to be printed */
  76.  
  77. prstab (list)
  78. char **list;
  79. {
  80.     fprstab (stdout,list);
  81. }
  82.  
  83. fprstab (file,list)
  84. FILE *file;
  85. char **list;
  86. {
  87.     register int nelem;    /* # elements in list */
  88.     register int maxwidth;    /* widest element */
  89.     register int i,l;    /* temps */
  90.     register int row,col;    /* current position */
  91.     register int nrow,ncol;    /* desired format */
  92.     char format[20];    /* format for printing strings */
  93.  
  94.     maxwidth = 0;
  95.     for (i=0; list[i]; i++) {
  96.         l = strlen (list[i]);
  97.         if (l > maxwidth)  maxwidth = l;
  98.     }
  99.  
  100.     nelem = i;
  101.     if (nelem <= 0)  return;
  102.  
  103.     ncol = MAXCOLS / (maxwidth + SPACE);
  104.     if (ncol < 1)  ncol = 1;    /* for very long strings */
  105.     if (ncol > (nelem + MINROWS - 1) / MINROWS)
  106.         ncol = (nelem + MINROWS - 1) / MINROWS;
  107.     nrow = (nelem + ncol - 1) / ncol;
  108.  
  109.     sprintf (format,"%%-%ds",maxwidth+SPACE);
  110.  
  111.     for (row=0; row<nrow; row++) {
  112.         fprintf (file,"\t");
  113.         for (col=0; col<ncol; col++) {
  114.             i = row + (col * nrow);
  115.             if (i < nelem) {
  116.                 if (col < ncol - 1) {
  117.                     fprintf (file,format,list[i]);
  118.                 }
  119.                 else {
  120.                     fprintf (file,"%s",list[i]);
  121.                 }
  122.             }
  123.         }
  124.         fprintf (file,"\n");
  125.     }
  126. }
  127.